package cn.yunhe.shop;

import java.io.IOException;
import java.lang.reflect.Method;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.Charset;

public class ShopBoot {

	/**
	 * 服务端
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		
		
		ServerSocket serverSocket = new ServerSocket(8080);
		String requestdata = "";
		while(true) {
			Socket socketServer = serverSocket.accept();
			byte[] b = new byte[1];
			while(socketServer.getInputStream().read(b)!=-1) {
				requestdata = requestdata + new String(b);
			}
			//测试一下  在继续
			System.out.println("从客户端接收到的数据："+requestdata);
			
			//解码
			String[] split = requestdata.split("/r/n");
			String packageName = split[0];
			String className = split[1];
			String method = split[2];
			String argVal = split[3];
			
			try {
				//反射  传入包名和类名
				Class<?> classObj = Class.forName(packageName+"."+className);
				
				//OrderServer orderServer =  (OrderServer)Class.forName(packageName+"."+className).newInstance();//实例化 然后强转
				//orderServer.getOrderInfo(orderId)  删除了 不用了
				
				// 通过方法名和 参数类型 拿到对应的方法---因为多态  所以要准确
				Method fanhuiMethod = classObj.getMethod(method, String.class);
				//方法被那个对象执行呢？？  执行方法  需要传入要执行的实例化后的类和参数
				String result = (String)fanhuiMethod.invoke(classObj.newInstance(), argVal);
				
				
				System.out.println("返回给客户端的结果："+result);
				//写会客户端--字符串转为字节数组
				socketServer.getOutputStream().write(result.getBytes(Charset.forName("UTF-8")));
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
			
			socketServer.close();
		}
		
		
	}
}
